package cn.lblbc.appassit.utils

import net.sourceforge.pinyin4j.PinyinHelper
import net.sourceforge.pinyin4j.format.HanyuPinyinCaseType
import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat
import net.sourceforge.pinyin4j.format.HanyuPinyinToneType
import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination

object PinyinUtils {
    
    /**
     * 将字符串转换为拼音排序键
     * @param str 输入字符串
     * @return 可用于排序的字符串
     */
    fun getPinyinSortKey(str: String): String {
        return try {
            val pinyin = StringBuilder()
            val format = HanyuPinyinOutputFormat()
            format.caseType = HanyuPinyinCaseType.LOWERCASE
            format.toneType = HanyuPinyinToneType.WITHOUT_TONE
            
            for (i in str.indices) {
                val char = str[i]
                if (char.toString().matches(Regex("[\\u4e00-\\u9fa5]"))) {
                    // 是中文字符
                    val py = PinyinHelper.toHanyuPinyinStringArray(char, format)
                    if (py != null && py.isNotEmpty()) {
                        pinyin.append(py[0])
                    }
                } else {
                    // 不是中文字符，直接添加
                    pinyin.append(char.lowercaseChar())
                }
            }
            pinyin.toString()
        } catch (e: BadHanyuPinyinOutputFormatCombination) {
            // 如果转换失败，返回原字符串的小写形式
            str.lowercase()
        }
    }
    
    /**
     * 比较两个字符串，支持中文拼音排序
     * @param str1 第一个字符串
     * @param str2 第二个字符串
     * @return 比较结果
     */
    fun compareWithPinyin(str1: String, str2: String): Int {
        val key1 = getPinyinSortKey(str1)
        val key2 = getPinyinSortKey(str2)
        return key1.compareTo(key2)
    }
}